#include <sw/redis++/redis++.h>

#include <iostream>
#include <string>
#include <vector>
using namespace sw::redis;

void RetryConnection(Redis &redis)
{
    std::string s1 = redis.ping();
    int cnt = 5;
    while (s1 != "PONG" && cnt)
    {
        --cnt;
        s1 = redis.ping();
    }
}

void unity1(Redis &redis)
{
    printf("开始测试string类型了\n");
    printf("开始测试mset\n");

    redis.flushall();
    std::vector<std::pair<std::string, std::string>> kvs = {{"u1", "张三"}, {"u2", "李四"}};
    redis.mset(kvs.begin(), kvs.end());
    std::vector<OptionalString> vals;
    auto it = std::back_inserter(vals);
    redis.mget({"u1", "u2"}, it);
    for (auto &str : vals)
    {
        if (str.has_value())
            std::cout << str.value() << std::endl;
    }
    printf("---------------------\n");
}

void unity2(Redis &redis)
{
    printf("开始执行setnx命令\n");
    // u1已存在
    bool ret = redis.setnx("u1", "王五");
    if (ret == false)
    {
        std::cerr << "设置key:u1失败,redis中已存在该key" << std::endl;
    }
    else
    {
        std::cerr << "设置u1 :王五 成功!" << std::endl;
    }
    ret = redis.setnx("u3", "王五");
    if (ret == false)
    {
        std::cerr << "设置key:u3失败,redis中已存在该key" << std::endl;
        return;
    }
    else
    {
        std::cerr << "设置u3 :王五 成功!" << std::endl;
    }
    printf("---------------------\n");
}

void unity3(Redis &redis)
{
    printf("开始执行append和strlen命令\n");
    redis.set("k1", "hello");
    OptionalString val = redis.get("k1");
    long long len = redis.strlen("k1");
    if (val.has_value())
        std::cout << "val : " << val.value() << std::endl;
    std::cout << "append前的长度: " << len << std::endl;
    len = redis.append("k1", "word");
    std::cout << "append后的长度: " << len << std::endl;
    printf("--------------------------\n");
}

void unity4(Redis& redis)
{

    printf("开始执行setrange和getrange命令\n");

    redis.flushall();

    redis.set("k1", "今天天气真好!");

    std::string s = redis.getrange("k1", 0, 2);
    std::cout << "截取后的字串为: " << s << std::endl;

    long long ret = redis.setrange("k1", 0, "明天见!");

    std::cout << "setrange ret = " << ret << std::endl;

    OptionalString val = redis.get("k1");
    if (val.has_value()) std::cout << "val : " << val.value() << std::endl;
    printf("--------------------------\n");
}
int main()
{
    Redis redis("tcp://127.0.0.1:6379");
    RetryConnection(redis);
    // unity1(redis);
    // unity2(redis);
    // unity3(redis);
    // unity4(redis);
    return 0;
}